#include "YXFile.h"
#include "YXConstant.h"

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int yx_file_is_exist(const char *path) {
    struct stat st;
    return stat(path, &st) == 0;
}

int yx_file_mkdir(const char *path) {
#if defined(_WIN32) || defined(_WIN64)
    return mkdir(path);
#else
    return mkdir(path, 0755);
#endif
}

int yx_file_create(const char *path) {
    FILE* fp;
    if ((fp = yx_file_open(path, "w")) != NULL) {
        fclose(fp);
        return YX_OK;
    }
    return YX_ERR;
}

/**
 * 打开文件（如果路径不存在则创建路径）
 */
FILE *yx_file_open(const char *path, const char *mode) {
    int path_len = strlen(path);
    char* buf = malloc(path_len);
    // 找到第一个路径分隔符
    char *p = strchr(path, '/');
    if (p != NULL) {
        int i = p - path;
        // 遍历整个路径，尝试创建每一级目录
        for ( ; path[i] != '\0'; i++) {
            if (path[i] == '/') {
                // 复制子路径
                strncpy(buf, path, i);
                buf[i] = '\0';
                // 尝试创建子路径目录
                if (yx_file_mkdir(path) == YX_ERR) {
                    // 如果创建失败，检查是否因为目录已存在
                    if (errno != EEXIST) {
                        return NULL;
                    }
                }
            }
        }
    }
    return fopen(path, mode);
}
